<?php
namespace Swiftx\Interfaces\Orm;
use \PDO;
/**
 * 对象查询器接口
 *
 * @author		Hismer <odaytudio@gmail.com>
 * @since		2017-05-09
 * @copyright	Copyright (c) 2014-2017 Swiftx Inc.
 * @default-implement Swiftx\Component\Orm\Statement\Builder singleton=false
 */
interface Builder {

    /**
     * 构造函数
     * @param Manager $manager
     */
    public function setManager(Manager $manager);

    /**
     * 设置连接实例
     * @param PDO $connect
     */
    public function setConnect(PDO $connect);

    /**
     * 设置实体类名
     * @param string $className
     */
    public function setEntity(string $className);

    /**
     * 设置查询条件
     * @param string $sql
     * @param bool $and
     * @return Builder
     */
    public function conditionSql(string $sql, bool $and=true):Builder;

    /**
     * 查询条件分组
     * @param bool $status
     * @return Builder
     */
    public function conditionGroup(bool $status):Builder;

    /**
     * 设置非空查询条件
     * @param string $field
     * @param bool $equal
     * @param bool $and
     * @return Builder
     */
    public function conditionIsNull(string $field, bool $equal=true, bool $and=true):Builder;

    /**
     * 设置字符串等值查询条件
     * @param string $field
     * @param string $value
     * @param bool $and
     * @return Builder
     */
    public function conditionEqualString(string $field, string $value, bool $and=true):Builder;

    /**
     * 设置整型等值查询条件
     * @param string $field
     * @param int $value
     * @param bool $and
     * @return Builder
     */
    public function conditionEqualInt(string $field, int $value, bool $and=true):Builder;

    /**
     * 设置浮点等值查询条件
     * @param string $field
     * @param float $value
     * @param bool $and
     * @return Builder
     */
    public function conditionEqualFloat(string $field, float $value, bool $and=true):Builder;

    /**
     * 设置整型大于等于比较查询条件
     * @param string $field
     * @param int $value
     * @param bool $and
     * @return Builder
     */
    public function conditionEqualGtInt(string $field, int $value, bool $and=true):Builder;

    /**
     * 设置整型小于等于比较查询条件
     * @param string $field
     * @param int $value
     * @param bool $and
     * @return Builder
     */
    public function conditionEqualLtInt(string $field, int $value, bool $and=true):Builder;

    /**
     * 设置模糊匹配查询条件
     * @param string $field
     * @param string $value
     * @param bool $and
     * @return Builder
     */
    public function conditionLike(string $field, string $value, bool $and=true):Builder;

    /**
     * 增加Order排序条件
     * @param $field
     * @param bool $asc
     * @return $this
     */
    public function orderBy($field, bool $asc = true);

    /**
     * 获取查询对象
     * @param int $offset
     * @return Entity
     */
    public function fetch(int $offset = 0):Entity;

    /**
     * 获取查询结果集
     * @param int $number
     * @param int $offset
     * @return array|Entity[]
     */
    public function list(int $number = 0, int $offset = 0):array;

    /**
     * 获取图片集合
     * @param int $current
     * @param int $number
     * @param bool $sync
     * @return Pager
     */
    public function page(int $current, int $number, bool $sync=true):Pager;

    /**
     * 统计查询记录数
     * @return int
     */
    public function count():int;

}